package 两数之和;

import java.util.HashMap;

public class Solution
{
    //给出一个整数数组，请在数组中找出两个加起来等于目标值的数，
    //你给出的函数twoSum 需要返回这两个数字的下标（index1，index2），需要满足 index1 小于index2.。注意：下标是从1开始的
    //假设给出的数组中只存在唯一解
    //例如：
    //给出的数组为 {2, 7, 11, 15},目标值为9
    //输出 index1=1, index2=2
    public int[] twoSum(int[] numbers, int target)
    {
        //双指针法，仅适用排序的数组
        int index1 = 0;
        int index2 = numbers.length - 1;
        int[] res = new int[2];
        while (index1 < index2)
        {
            if (numbers[index1] + numbers[index2] == target)
            {
                res[0] = index1 + 1;
                res[1] = index2 + 1;
            } else if (numbers[index1] + numbers[index2] > target)
                index2--;
            else
                index1++;
        }
        return res;
    }

    public int[] twoSum1(int[] numbers, int target)
    {
        //hash法，map，key是target-当前值，value是下标
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int[] res = new int[2];
        for (int i = 0; i < numbers.length; i++)
        {
            if (hashMap.containsKey(numbers[i]))
            {
                res[0] = hashMap.get(numbers[i]) + 1;
                res[1] = i + 1;
                break;
            } else
            {
                hashMap.put(target - numbers[i], i);
            }
        }
        return res;
    }
}
